import 'group_key.dart';

///执行者
///开始一个无限循环的执行进程，等待事件默认50毫秒
class Executor {
  final GroupKey key;

  ///延迟时间。
  ///进程执行的快慢，单位毫秒ms，时间越短，反应越灵敏，
  ///但是消耗的新能越多，不能设置为0，否则会卡住进程。
  ///默认延迟50ms。
  final int? delayed;
  bool _stop = true;
  Function(GroupKey key)? _stopCallback;
  Function(GroupKey key)? _startCallback;

  Executor(this.key, {this.delayed});

  ///开始执行[Executor]
  ///[callback]会循环调用
  start({Function(GroupKey key)? callback}) async {
    _stop = false;
    _startCallback = callback ?? _startCallback;
    while (!_stop) {
      _startCallback?.call(key);
      await Future.delayed(Duration(milliseconds: delayed ?? 50));
    }
    _stopCallback?.call(key);
  }

  ///结束执行[Executor]
  ///[callback]只会在进程结束时执行一次
  stop({Function(GroupKey key)? callback}) {
    _stop = true;
    _stopCallback = callback ?? _stopCallback;
  }

  ///是否已启动
  bool isStart() {
    return !_stop;
  }

  @override
  int get hashCode => key.hashCode;

  @override
  bool operator ==(Object other) =>
      other is! Executor ? false : key == other.key;
}